package reflect;

import socket.Client;

import java.lang.reflect.Array;
import java.lang.reflect.Method;

public class ReflectDemo1 {
    public static void main(String[] args) {
         /*
            反射的第一步是获取要操作的类的类对象：Class的实例
            JVM内部每个被加载的类都有且只有唯一的一个Class实例与之绑定。
            而Class实例被称为"类对象"，它记录了其表示的类的相关信息，如
            类名，有哪些方法，属性，构造器等等。
            因此通过获取一个类的类对象就可以反映出该类的相关信息，便于在运行期间
            进行相关的操作


            获取一个类的类对象的方式:
            1:类名.class
              Class cls = String.class;
              Class cls = int.class;
              注意:获取基本类型的类对象只有上述一种方式

            2:Class.forName(String className)
              通过指定一个类的完全限定名:包名.类名  形式获取一个类的类对象
              Class cls = Class.forName("java.lang.String");

            3:类加载器:ClassLoader

            4:对象.getClass()
         */

        //获取String的类对象
     //   Class cls = String.class;
        Class cls = Array.class;
        //通过类对象获取其表示的类的完全限定名
        String className = cls.getName();
        System.out.println(className);



        //通过类对象获取表示的类的类名
        className = cls.getSimpleName();
        System.out.println(className);

        /*Package反射对象之一
        他的每一个实例用于表示一个包的信息
        * */
        Package pack = cls.getPackage();
  /*
            Method 反射对象之一
            Method对象的每一个实例用于表示一个方法的信息
         */      String pName = pack.getName();
        System.out.println("包名"+pName);
        System.out.println("-----------------------------------------");
/*
            Method 反射对象之一
            Method对象的每一个实例用于表示一个方法的信息
         */
        Method[] methods = cls.getMethods();
        System.out.println("方法个数："+methods.length);
        for (Method method:methods){
            System.out.println(method.getName());
        }
    }
}
